home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル応用編 / 簡易エディタ / SEFILE.C < prev    next >
Text File  |  1994-03-10  |  8KB  |  230 lines

  1. /******************************************************************************
  2.  *    sefile.c:    ファイルのロード、セーブ処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stat.h>
  9. #include <io.h>
  10. #include <doslib.h>
  11. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  12. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  13. #include <control.h>        /* コントロールマンを利用するときに必要    */
  14. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  15. #include <text.h>        /* テキストマンを利用するときに必要    */
  16. #include <task.h>        /* タスクマンを利用するときに必要    */
  17. #include "sedit.h"        /* このプログラム固有のヘッダファイル    */
  18.  
  19. /******************************************************************************
  20.  *    readFile():    ファイルの読み込み
  21.  ******************************************************************************
  22.  *    引数:    ComVal *pcv    共通変数へのポインタ
  23.  *    戻り値:    int        >= 0: 読み込み成功
  24.  *                = -1: 読み込み失敗
  25.  *                = -2: ファイルが見付からない
  26.  */
  27. int readFile(ComVal *pcv, char *pname)
  28. {
  29.     int hdlProp, fileLen, data, errCode, len;
  30.     FILE *fn;
  31.  
  32.     fn = fopen(pname, "rb");
  33.     if (fn == NULL)
  34.         return -2;
  35.  
  36.     pcv->editFlag = FALSE;        /* 編集フラグをクリアする    */
  37.     if ((*pcv->tEditHdl)->length) {
  38.         /* テキストエディットをすべて消去する */
  39.         TMHide(pcv->tEditHdl);    /* 非表示属性にする        */
  40.         /* 全範囲領域選択する(表示の変更はしない) */
  41.         TMCheckSel(pcv->tEditHdl, 0, (*pcv->tEditHdl)->length, (*pcv->tEditHdl)->length);
  42.         TMDelete(pcv->tEditHdl); /* セレクト部分を削除する    */
  43.         TMCacheFlush(pcv->tEditHdl);
  44.         TMShow(pcv->tEditHdl);    /* 表示属性に戻す        */
  45.     }
  46.     fseek(fn, -1, SEEK_END);
  47.     fileLen = ftell(fn);        /* ファイルサイズを求める    */
  48.     fseek(fn, 0, SEEK_SET);
  49.  
  50.     if (fileLen) {
  51.         /* ハンドルの属性を保存 */
  52.         hdlProp = MMHdlPropGet((*pcv->tEditHdl)->text);
  53.         /* ハンドルのロックを解除する */
  54.         MMHdlUnlock((*pcv->tEditHdl)->text);
  55.         /* ハンドルのサイズを変更する */
  56.         errCode = MMHdlSizeSet((*pcv->tEditHdl)->text, fileLen + 8);
  57.         /* ハンドルの属性を元に戻す */
  58.         MMHdlPropSet((*pcv->tEditHdl)->text, hdlProp);
  59.         if (errCode < 0) {
  60.             pcv->errorCode = 8; /* メモリが確保できなかった    */
  61.             fclose(fn);
  62.             return -1;
  63.         }
  64.         len = fread((unsigned char *) *(*pcv->tEditHdl)->text, sizeof(char), (size_t) fileLen, fn);
  65.         /* バイナリモードでファイルをオープンしているので、
  66.            テキストの終了コード EOF('\x1a')を読み込まないようにする */
  67.         fseek(fn, -1, SEEK_END);
  68.         data = fgetc(fn);
  69.         if (data != '\x1a') {
  70.         /* ファイルの最後が EOF で終わってない場合 */
  71.             (*(*pcv->tEditHdl)->text)[len] = data;
  72.             len++;
  73.             fileLen++;
  74.             data = 0;
  75.         }
  76.         if (len < fileLen) {
  77.             pcv->errorCode = 11; /* リードエラー        */
  78.             fclose(fn);
  79.             return -1;
  80.         }
  81.         TMHide(pcv->tEditHdl);
  82.         (*pcv->tEditHdl)->length = fileLen;
  83.         /* テキストエディットの段落情報を再計算する */
  84.         TMSetSelCal(pcv->tEditHdl, 0, 0, 0);
  85.         /* テキストエディットの先頭行までスクロールする */
  86.         TMPinScroll(pcv->tEditHdl);
  87.         TMShow(pcv->tEditHdl);
  88.         /* テキストエディット全体をアップデートする */
  89.         addUpdate(pcv->windowPtr, &pcv->view);
  90.     }
  91.     fclose(fn);
  92.     strcpy(pcv->fileName, pname);    /* ファイル名をワークに登録する    */
  93.     setWinTitle(pcv);        /* ウィンドウタイトルを設定する    */
  94.  
  95.     return 0;
  96. }
  97.  
  98. /******************************************************************************
  99.  *    saveFile():    ファイルのセーブ
  100.  ******************************************************************************
  101.  *    引数:    ComVal *pcv    共通変数へのポインタ
  102.  */
  103. void saveFile(ComVal *pcv)
  104. {
  105.     /* 疑似ダイアログを表示してファイル名を取得する */
  106.     TMCaret(pcv->tEditHdl, 0);
  107.     pcv->eseFlag = SAVE;
  108.     /* 疑似ダイアログに文字列を設定する */
  109.     setEseStr(&pcv->eseDlg, pcv->fileName, (int) strlen(pcv->fileName));
  110.     showEseDlg(&pcv->eseDlg);
  111. }
  112.  
  113. /******************************************************************************
  114.  *    getFileName():    疑似ダイアログよりファイル名を取得する
  115.  ******************************************************************************
  116.  *    引数:    ComVal *pcv    共通変数へのポインタ
  117.  *        int num        = 1: [実行]ボタン
  118.  *                = 2: [取消]ボタン
  119.  */
  120. void getFileName(ComVal *pcv, int num)
  121. {
  122.     int mode, len;
  123.     char fWork[TS_NAMEMAX];
  124.  
  125.     /* ファイル入出力モードを取得する */
  126.     mode = pcv->eseFlag;
  127.     if (mode == SAVE)
  128.         mode = NONE;
  129.  
  130.     if (num == 1) {            /* [実行]ボタンか?        */
  131.         /* 入力文字列をワークにコピーする */
  132.         len = getEseStr(&pcv->eseDlg, fWork);
  133.         if (len == 0) {
  134.             /* 文字列が指定されていない場合 */
  135.             hideEseDlg(&pcv->eseDlg); /* 疑似ダイアログを消去する */
  136.             pcv->eseFlag = NONE;
  137.             TMCaret(pcv->tEditHdl, 1);
  138.             return;
  139.         }
  140.         fWork[len] = 0;
  141.         /* ファイル名とドライブの状態をチェックする */
  142.         if (!checkDrive(pcv, fWork, mode))
  143.             return;
  144.  
  145.         strcpy(pcv->fileName, fWork);
  146.         setWinTitle(pcv);    /* ウィンドウタイトルを設定する    */
  147.         writeFile(pcv);        /* ファイルへの書き込み        */
  148.     }
  149.     hideEseDlg(&pcv->eseDlg);    /* 疑似ダイアログを消去する    */
  150.     setEseStr(&pcv->eseDlg, "", 0);    /* 疑似ダイアログ文字列をクリアする */
  151.     pcv->eseFlag = NONE;
  152.     TMCaret(pcv->tEditHdl, 1);
  153. }
  154.  
  155. /******************************************************************************
  156.  *    checkDrive():        ファイル名、ドライブのチェック
  157.  ******************************************************************************
  158.  *    引数:    ComVal *pcv    共通変数へのポインタ
  159.  *        char *fName    ファイル名へのポインタ
  160.  *        int mode    ファイルのアクセスモード
  161.  *                = 0: 保存
  162.  *                = 1: 読み込み
  163.  *    戻り値:    BOOLEAN        = TRUE:  正常終了
  164.  *                = FALSE: 異常終了
  165.  */
  166. BOOLEAN checkDrive(ComVal *pcv, char *fName, int mode)
  167. {
  168.     int stat;
  169.     struct NAMECKBUF nminf;
  170.  
  171.     /* 入力されたファイル名を分解・検査 */
  172.     stat = NAMECK((unsigned char *) fName, &nminf);
  173.     if (stat != 0) {
  174.         pcv->errorCode = 14;    /* ファイル名がおかしい        */
  175.         return FALSE;
  176.     }
  177.     /* フルパス名を作成する */
  178.     strmfn(fName, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
  179.  
  180.     /* 指定ファイル名のドライブの状態を取得する */
  181.     stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
  182.     /* ドライブが準備されているかをチェックする */
  183.     if ((stat & 0x06) != 0x02) {
  184.         pcv->errorCode = 15;    /* 準備ができていない        */
  185.         return FALSE;
  186.     }
  187.     /* プロテクトされているかどうかをチェックする */
  188.     if (mode == 0 && (stat & 0x0a) == 0x0a) {
  189.         pcv->errorCode = 16;    /* ライトプロテクト        */
  190.         return FALSE;
  191.     }
  192.  
  193.     return TRUE;
  194. }
  195.  
  196. /******************************************************************************
  197.  *    writeFile():    ファイルへの書き込み
  198.  ******************************************************************************
  199.  *    引数:    ComVal *pcv    共通変数へのポインタ
  200.  *    戻り値:    BOOLEAN        = TRUE:  保存処理終了
  201.  *                = FALSE: 取消または異常終了
  202.  */
  203. BOOLEAN writeFile(ComVal *pcv)
  204. {
  205.     int len;
  206.     FILE *fn;
  207.  
  208.     fn = fopen(pcv->fileName, "wb");
  209.     if (fn == NULL) {
  210.         pcv->errorCode = 13;    /* ファイルができなかった    */
  211.         pcv->fileName[0] = 0;
  212.         return FALSE;
  213.     }
  214.     TMCacheFlush(pcv->tEditHdl);    /* キャッシュをフラッシュする */
  215.     /* ファイルに書き込む */
  216.     len = fwrite((unsigned char *) *(*pcv->tEditHdl)->text, sizeof(char), (size_t)(*pcv->tEditHdl)->length, fn);
  217.     if (len != (*pcv->tEditHdl)->length) {
  218.         pcv->errorCode = 12;    /* ライトエラー            */
  219.         pcv->fileName[0] = 0;
  220.         return FALSE;
  221.     }
  222.     /* ファイルの最後に EOF のコードを付加する */
  223.     fseek(fn, 0, SEEK_END);
  224.     fputc('\x1a', fn);
  225.     pcv->editFlag = FALSE;        /* 編集フラグをクリアする    */
  226.     fclose(fn);
  227.  
  228.     return TRUE;
  229. }
  230.